昨天提到,可以用Singleton模式,讓實體永遠只會建立一次。但如果現在是在多執行序的環境下,會發生什麼事呢?
為了避免上述事情發生,我們要用 Double-Checked Locking 模式來確保程式永遠只會有一個實例。
用於減少加鎖開銷,尤其是為多執行緒環境中的單例模式實現「惰性初始化」。
public sealed class Singleton
{
private static Singleton instance = null;
private static readonly object padlock = new object();
Singleton(){}
public static Singleton Instance
{
get
{
if (instance == null)
{
// 限制進來此處時只會有一個執行序
lock (padlock)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
-如果是 .Net 4 以上版本,可以用Lazy<T>
來實現。
public sealed class Singleton
{
private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton());
public static Singleton Instance { get { return lazy.Value; } }
private Singleton(){}
}
Double-Checked Locking模式的特點如下: